class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int sum = 0, ret = 0;
        unordered_map<int, int> preCnt; // 存储前缀和出现的次数
        preCnt[0] = 1; // 初始前缀和为0的出现一次
        for(auto& e : nums)
        {
            sum += e; // 处理前缀和
            if(preCnt.count(sum - k)) // 如果sum-k在preCnt中，就累加其出现次数
                ret += preCnt[sum - k];
            preCnt[sum]++; // 更新当前前缀和的出现次数
        }
        return ret;
    }
};